1 Define functions

## Define function that recodes to numeric, but watches out to coercion to not introduce NAs
colstonumeric <- function(df){
  tryCatch({
    df_num <- as.data.frame(
      lapply(df,
             function(x) { as.numeric(as.character(x))})) 
  },warning = function(stop_on_warning) {
    message("Stoped the execution of numeric conversion: ", conditionMessage(stop_on_warning))
  }) 
}
##
## Define function that reverse codes items
ReverseCode <- function(df, tonumeric = FALSE, min = NULL, max = NULL) {
  if(tonumeric) df <- colstonumeric(df)
  df <- (max + min) - df
}
##
## Define function that scores only rows with less than 10% NAs (returns NA if all or above threshold percentage of rows are NA); can reverse code if vector of column indexes and min, max are provided.
ScoreLikert <- function(df, napercent = .1, tonumeric = FALSE, reversecols = NULL, min = NULL, max = NULL, engine = "sum") {
  reverse_list <- list(reversecols = reversecols, min = min, max = max)
  reverse_check <- !sapply(reverse_list, is.null)
  
  # Recode to numeric, but watch out to coercion to not introduce NAs
  colstonumeric <- function(df){
    tryCatch({
      df_num <- as.data.frame(
        lapply(df,
               function(x) { as.numeric(as.character(x))})) 
    },warning = function(stop_on_warning) {
      message("Stoped the execution of numeric conversion: ", conditionMessage(stop_on_warning))
    }) 
  }
  
  if(tonumeric) df <- colstonumeric(df)
  
  if(all(reverse_check)){
    df[ ,reversecols] <- (max + min) - df[ ,reversecols]
  }else if(any(reverse_check)){
    stop("Insuficient info for reversing. Please provide: ", paste(names(reverse_list)[!reverse_check], collapse = ", "))
  }
  
  if(engine == "sum") {
    return(
      ifelse(rowSums(is.na(df)) > ncol(df) * napercent,
             NA,
             rowSums(df, na.rm = TRUE) * NA ^ (rowSums(!is.na(df)) == 0)
      )
    )  
  }
  
  if(engine == "mean") {
    return(
      ifelse(rowMeans(is.na(df)) > ncol(df) * napercent,
             NA,
             rowMeans(df, na.rm = TRUE) * NA ^ (rowSums(!is.na(df)) == 0)
      )       
    )
  }
  
    if(engine == "mean_na") {
      df[is.na(df)] <- 0
      rowMeans(df)
    }
}

2 Read survey structure

folder <- here::here("Rsyntax&data")
data_name <- "survey_686732_R_data_file.csv"
script_name <- "survey_686732_R_syntax_file.R"
  
# Check most recent .csv file
last_csv_file <- 
  dir(folder, pattern = ".*csv", full.names = TRUE) %>% 
  file.info() %>%
  dplyr::arrange(dplyr::desc(ctime)) %>%
  dplyr::slice(1) %>%
  row.names()
if(identical(last_csv_file, file.path(folder, data_name))) {
  cat("Most recent .csv is used.")
} else {
  cat("NOT using the most recent .csv!")
}
Most recent .csv is used.
# -------------------------------------------------------------------------
# Read data
library(limonaid)
library(sticky)  # need this for sticky labels

df <- limonaid::ls_import_data(
  datafile = file.path(folder, data_name),
  scriptfile = file.path(folder, script_name),
  massConvertToNumeric = FALSE
)

df_compl <-
  df %>%
  filter(lastpage == 17)

# -------------------------------------------------------------------------
# Labels to factor levels levels ("label" = question text; "labels" = response options text)
# library(labelled)
# library(sjlabelled)
# sjlabelled::get_labels(df$G01Q59_SQ008, attr.only = TRUE, values = "as.prefix")
# sjlabelled::get_values(df$G01Q59_SQ008)
# sjlabelled::as_label(df$G01Q59_SQ008, prefix = TRUE, keep.labels = TRUE) 
# sjlabelled::as_character(df$G01Q59_SQ008, prefix = TRUE, keep.labels = TRUE)
# labelled::var_label(df$G01Q59_SQ008)
# labelled::to_factor(df$G01Q59_SQ008, levels = "values")

lime_label_recode <- function (x, prefix = FALSE) {
  labels <- attr(x, "labels", exact = TRUE)
  if (is.null(labels)) {
    x
  } else {
    labels <- unname(labels)
    values <- names(attr(x, "labels", exact = TRUE))
    if (prefix) {
      labels <- sprintf("[%s] %s", values, labels)
    }
    # No recoding solution preserve attributes, even with sticky
      x_rec <- c(labels, x)[match(x, c(values, x))]
    attributes(x_rec) <- attributes(x)  # reattach attributes
    x_rec
  }
}
# test_df <- cbind(df$G02Q02_SQ021, lime_label_recode(df$G02Q02_SQ021))
# lime_label_recode(df$G01Q59_SQ008)
# lime_label_recode(df$G04Q05_SQ001)

# -------------------------------------------------------------------------
# Recode using labels
# cols_to_recode <- lapply(df, function(x) {!is.null(attr(x, "labels", exact = TRUE))})
# cols_to_recode <- which(unlist(cols_to_recode))

# df_recoded <- df
# list_recoded <- lapply(df_recoded[, cols_to_recode], lime_label_recode)
# df_recoded[, cols_to_recode] <- as.data.frame(do.call(cbind, list_recoded))

# df_recoded <-
#   df %>%
#   mutate(across(all_of(cols_to_recode), lime_label_recode)) 

df_recoded <-
  df %>%
  mutate(across(everything(), lime_label_recode)) %>%   # some values have same labels: df$G01Q60_SQ006
  mutate(across(where(is.character), function(col) iconv(col, to="UTF-8")))  # encoding: df_recoded$G01Q56

3 Score 3 Questionnaires

# ------------------------------------------------------------------------------
# Define 3 scales
# ------------------------------------------------------------------------------
# ATSPPH - 10 items (likert 0-3) total sum
atspph_idx <- 184:193  # grep("G06Q13", names(df));  df[, grep("G06Q13", names(df), value = TRUE)]
atspph_labs <- unique(lapply(df[, atspph_idx], attr, "labels"))
atspph_rev <- c(2, 4, 8, 9, 10)

atspph_recode <- function(df, rev) {
  df %>%
    mutate(
      across(everything(),
        ~ case_when(
          . == "AO02" ~ 0,
          . == "AO03" ~ 1,
          . == "AO04" ~ 2,
          . == "AO05" ~ 3
        )
      )       
    ) %>%
    mutate(   # here reverse code
      across(rev,
      ~ 3 - .x 
      )
    )
}  # atspph_recode(df_compl[, atspph_idx], atspph_rev)

# FSozU - 6 items (likert 1-5) total mean
fsozu_idx <- 222:227 # grep("G12Q45", names(df)); df[, grep("G12Q45", names(df), value = TRUE)]  
fsozu_labs <- unique(lapply(df[, fsozu_idx], attr, "labels"))  

fsozu_recode <- function(df) {
  df %>%
    mutate(
      across(everything(),
        ~ case_when(
          . == "AO01" ~ 1,
          . == "AO02" ~ 2,
          . == "AO03" ~ 3,
          . == "AO04" ~ 4,
          . == "AO05" ~ 5
        )
      )       
    ) 
}  # fsozu_recode(df_compl[, fsozu_idx])

# PMHSS - 24 items (likert 1-5) subscale sum
pmhss_idx <- 228:251   # grep("G13Q46", names(df)); df[, grep("G13Q46", names(df), value = TRUE)]
pmhss_labs <- unique(lapply(df[, pmhss_idx], attr, "labels"))

pmhss_aware <- c(2, 4, 5, 6, 8, 10, 11, 12)  
pmhss_agree <- c(14, 16, 17, 18, 20, 22, 23, 24) 
pmhss_posit <- c(1, 3, 7, 9, 13, 15, 19, 21)

pmhss_recode <- function(df) {
  df %>%
    mutate(
      across(everything(),
        ~ case_when(
          . == "AO01" ~ 1,
          . == "AO02" ~ 2,
          . == "AO03" ~ 3,
          . == "AO04" ~ 4,
          . == "AO05" ~ 5
        )
      )       
    )
}  # pmhss_recode(df_compl[, pmhss_idx])

# ------------------------------------------------------------------------------
# Recode & Score
df_compl[, atspph_idx] <- atspph_recode(df_compl[, atspph_idx], atspph_rev)
df_compl[, fsozu_idx] <- fsozu_recode(df_compl[, fsozu_idx])
df_compl[, pmhss_idx] <- pmhss_recode(df_compl[, pmhss_idx])

df_compl$help_seek <- ScoreLikert(df_compl[, atspph_idx], napercent = .5, engine = "sum")
df_compl$soc_supp <- ScoreLikert(df_compl[, fsozu_idx], napercent = .5, engine = "mean")

df_compl$aware <- ScoreLikert(df_compl[, pmhss_idx][pmhss_aware], napercent = .5, engine = "sum") 
df_compl$agree <- ScoreLikert(df_compl[, pmhss_idx][pmhss_agree], napercent = .5, engine = "sum")
df_compl$posit <- ScoreLikert(df_compl[, pmhss_idx][pmhss_posit], napercent = .5, engine = "sum")

4 Some analyses on 3 Questionnaires

4.0.1 Just checks

NULL

4.0.2 Mod - just check

# find_mod(df_scales)
# moderation_model_list #1,2,3,6,7,10,11,12

mod_synth <-
  moderation_model_list %>%
  purrr::pluck("Syntax") %>%
  stringr::str_match("# Regressions\\\n(.*?)\\\n\\\n#") %>%   # string between "# Regressions\n" and "\n\n#"
  as.data.frame() %>%
  dplyr::pull(2) %>% 
  stringr::str_remove_all(fixed("b0*1 + ")) 

mod_tabl <- 
  moderation_model_list %>%
  purrr::pluck("Model")

for(i in seq_len(length(mod_tabl))) {print(mod_synth[i]); print(mod_tabl[[i]])}
[1] "help_seek ~ b1*age + b2*aware + b3*ageaware"
[1] "help_seek ~ b1*age + b2*agree + b3*ageagree"
[1] "soc_supp ~ b1*agree + b2*aware + b3*agreeaware"
[1] "aware ~ b1*age + b2*help_seek + b3*agehelp_seek"
[1] "aware ~ b1*agree + b2*soc_supp + b3*agreesoc_supp"
[1] "aware ~ b1*posit + b2*soc_supp + b3*positsoc_supp"
[1] "agree ~ b1*age + b2*help_seek + b3*agehelp_seek"
[1] "agree ~ b1*posit + b2*soc_supp + b3*positsoc_supp"
[1] "agree ~ b1*posit + b2*aware + b3*positaware"
[1] "posit ~ b1*aware + b2*soc_supp + b3*awaresoc_supp"
[1] "posit ~ b1*agree + b2*soc_supp + b3*agreesoc_supp"
[1] "posit ~ b1*agree + b2*aware + b3*agreeaware"
[1] "age ~ b1*aware + b2*help_seek + b3*awarehelp_seek"
[1] "age ~ b1*agree + b2*help_seek + b3*agreehelp_seek"
[1] "age ~ b1*agree + b2*aware + b3*agreeaware"

4.0.3 Med - just check

# find_med(df_scales)
# mediation_model_list

for(i in seq_len(length(mediation_model_list$MedEs))) {print(mediation_model_list$MedEs[i]); print(mediation_model_list$PathEs[[i]])}
$model_1
    effect     label         est         se        lower      upper          z         p        pm
1 Indirect     a × b  0.03977335 0.01721567  0.006031253 0.07351545  2.3102990 0.0208716  40.70041
2   Direct         c -0.05794888 0.03647158 -0.129431877 0.01353411 -1.5888776 0.1120880  59.29959
3    Total c + a × b -0.01817553 0.03253100 -0.081935121 0.04558405 -0.5587143 0.5763567 100.00000
$model_2
    effect     label         est         se        lower       upper         z          p        pm
1 Indirect     a × b  0.02357673 0.01106423  0.001891225 0.045262225  2.130895 0.03309776  26.54287
2   Direct         c -0.06524837 0.03687318 -0.137518477 0.007021738 -1.769535 0.07680471  73.45713
3    Total c + a × b -0.04167164 0.03555378 -0.111355766 0.028012478 -1.172074 0.24116750 100.00000
$model_3
    effect     label          est          se        lower      upper         z          p         pm
1 Indirect     a × b 0.0114499751 0.005176223  0.001304765 0.02159519 2.2120329 0.02696439  96.868121
2   Direct         c 0.0003701934 0.008706562 -0.016694355 0.01743474 0.0425189 0.96608505   3.131879
3    Total c + a × b 0.0118201685 0.007074084 -0.002044780 0.02568512 1.6709116 0.09473913 100.000000
$model_4
    effect     label          est          se        lower       upper         z               p        pm
1 Indirect     a × b  0.021066430 0.004081768  0.013066311 0.029066549  5.161104 0.0000002454981  68.96143
2   Direct         c -0.009481705 0.007772544 -0.024715611 0.005752201 -1.219897 0.2225038237341  31.03857
3    Total c + a × b  0.011584725 0.007085497 -0.002302595 0.025472045  1.634991 0.1020509156450 100.00000
$model_5
    effect     label         est          se        lower      upper        z             p        pm
1 Indirect     a × b 0.011921385 0.002903842  0.006229959 0.01761281 4.105383 0.00004036453  55.17638
2   Direct         c 0.009684574 0.007859872 -0.005720493 0.02508964 1.232154 0.21789152443  44.82362
3    Total c + a × b 0.021605958 0.007732044  0.006451431 0.03676049 2.794340 0.00520057805 100.00000
$model_6
    effect     label        est        se       lower     upper         z           p         pm
1 Indirect     a × b 0.48006170 0.1744613  0.13812392 0.8219995 2.7516808 0.005929028  97.920426
2   Direct         c 0.01019526 0.2397818 -0.45976836 0.4801589 0.0425189 0.966085047   2.079574
3    Total c + a × b 0.49025696 0.2934069 -0.08480994 1.0653239 1.6709116 0.094739131 100.000000
$model_7
    effect     label       est         se     lower     upper         z                 p        pm
1 Indirect     a × b 0.1504592 0.02510330 0.1012576 0.1996608  5.993603 0.000000002052426  30.32096
2   Direct         c 0.3457625 0.03731608 0.2726243 0.4189007  9.265776 0.000000000000000  69.67904
3    Total c + a × b 0.4962217 0.04228655 0.4133416 0.5791018 11.734739 0.000000000000000 100.00000
$model_8
    effect     label       est        se       lower     upper         z               p        pm
1 Indirect     a × b  0.802374 0.1533110  0.50189006 1.1028580  5.233638 0.0000001662062  71.15351
2   Direct         c -0.325292 0.2666553 -0.84792675 0.1973427 -1.219897 0.2225038237341  28.84649
3    Total c + a × b  0.477082 0.2917949 -0.09482542 1.0489894  1.634991 0.1020509156450 100.00000
$model_9
    effect     label       est         se      lower     upper         z                p        pm
1 Indirect     a × b 0.1048390 0.01941788 0.06678061 0.1428973  5.399094 0.00000006697835  16.21354
2   Direct         c 0.5417745 0.03899136 0.46535282 0.6181961 13.894731 0.00000000000000  83.78646
3    Total c + a × b 0.6466134 0.04051343 0.56720858 0.7260183 15.960472 0.00000000000000 100.00000
$model_10
    effect     label        est         se      lower      upper         z                   p       pm
1 Indirect     a × b 0.26272501 0.02930484  0.2052886 0.32016144 8.9652432 0.00000000000000000  94.6022
2   Direct         c 0.01499053 0.04004682 -0.0634998 0.09348086 0.3743251 0.70816247904824503   5.3978
3    Total c + a × b 0.27771554 0.04180285  0.1957835 0.35964762 6.6434599 0.00000000003064038 100.0000
$model_11
    effect     label       est         se      lower     upper        z            p        pm
1 Indirect     a × b 0.4161393 0.09870205  0.2226868 0.6095917 4.216116 0.0000248546  56.05467
2   Direct         c 0.3262419 0.26477360 -0.1927048 0.8451886 1.232154 0.2178915244  43.94533
3    Total c + a × b 0.7423811 0.26567317  0.2216713 1.2630910 2.794340 0.0052005781 100.00000
$model_12
    effect     label        est         se       lower      upper        z                   p         pm
1 Indirect     a × b 0.02964074 0.01203087 0.006060659 0.05322082 2.463723 0.01375023806726228   9.760248
2   Direct         c 0.27404763 0.04482220 0.186197727 0.36189754 6.114104 0.00000000097100727  90.239752
3    Total c + a × b 0.30368837 0.04570911 0.214100160 0.39327658 6.643935 0.00000000003054157 100.000000
$model_13
    effect     label        est         se      lower       upper          z          p        pm
1 Indirect     a × b -0.1869264 0.09392011 -0.3710064 -0.00284633 -1.9902699 0.04656122  43.89865
2   Direct         c  0.2388871 0.33008990 -0.4080773  0.88585138  0.7237030 0.46924808  56.10135
3    Total c + a × b  0.0519607 0.34025590 -0.6149286  0.71885001  0.1527107 0.87862645 100.00000
$model_14
    effect     label        est         se       lower     upper         z                       p         pm
1 Indirect     a × b 0.28374330 0.03540910  0.21434274 0.3531438 8.0132884 0.000000000000001110223  93.579512
2   Direct         c 0.01946762 0.05200726 -0.08246473 0.1214000 0.3743251 0.708162479048245474544   6.420488
3    Total c + a × b 0.30321092 0.04564051  0.21375716 0.3926647 6.6434599 0.000000000030640379123 100.000000
$model_15
    effect     label       est         se      lower     upper        z                 p        pm
1 Indirect     a × b 0.2034478 0.08005067 0.04655136 0.3603442 2.541488 0.011038186582389  12.91465
2   Direct         c 1.3718780 0.26273619 0.85692450 1.8868314 5.221504 0.000000177476211  87.08535
3    Total c + a × b 1.5753258 0.27059923 1.04496101 2.1056905 5.821619 0.000000005828013 100.00000
$model_16
    effect     label           est          se        lower         upper          z          p        pm
1 Indirect     a × b -0.0036200998 0.001736830 -0.007024223 -0.0002159762 -2.0843148 0.03713154  44.29214
2   Direct         c  0.0045531340 0.006291440 -0.007777862  0.0168841295  0.7237030 0.46924808  55.70786
3    Total c + a × b  0.0009330342 0.006109817 -0.011041987  0.0129080555  0.1527107 0.87862645 100.00000

4.0.4 Odd stigma patterns

ggplot(df_scales, aes(aware, agree, color = posit)) +
  geom_smooth(method = "loess", formula = y ~ x, se = TRUE, alpha = 0.1, color = "red", fill = "red") +
  geom_point() +
  scale_colour_distiller(palette = "Blues", direction = 1)


df_scales %>%
  mutate(posit_cat = cut(posit,
    breaks = c(5, 10, 20, 30, 40))
  ) %>%
  ggplot(aes(aware, agree, color = posit_cat)) +
  geom_point() -> plot_stigma1
plotly::ggplotly(plot_stigma1)

ggplot(df_scales, aes(posit, agree, color = aware)) +
  geom_smooth(method = "loess", formula = y ~ x, se = TRUE, alpha = 0.1, color = "red", fill = "red") +
  geom_point() +
  scale_colour_distiller(palette = "Blues", direction = 1)


df_scales %>%
  mutate(aware_cat = cut(posit,
                         breaks = c(5, 10, 20, 30, 40))
  ) %>%
  ggplot(aes(posit, agree, color = aware_cat)) +
  geom_point() -> plot_stigma2
plotly::ggplotly(plot_stigma2)

4.0.5 Partial correlations stigma (partial everything from everything)

psych::lowerMat(psych::partial.r(df_scales[, c("agree", "aware", "posit")]))
      agree aware posit
agree 1.00             
aware 0.54  1.00       
posit 0.02  0.39  1.00 

4.0.6 Interaction stigma

mod_stigma_interac <- lm(agree ~ aware * posit, data = df_agree)
interactions::interact_plot(mod_stigma_interac, pred = posit, modx = aware)

# interactions::sim_slopes(mod_stigma_interac, pred = posit, modx = aware)

4.0.7 Gender diff stigma

ggstatsplot::ggbetweenstats(df_agree, x = sex, y = agree)

ggstatsplot::ggbetweenstats(df_agree, x = sex, y = aware)

ggstatsplot::ggbetweenstats(df_agree, x = sex, y = posit)

4.0.8 Silly model that works smh (0 m, 1 fem)

df_scales %>% 
  mutate(sex = as.numeric(as.factor(sex)) - 1) %>% 
  psych::mediate(posit ~ sex + aware:agree + (aware), data = .)

Mediation/Moderation Analysis 
Call: psych::mediate(y = posit ~ sex + aware:agree + (aware), data = .)

The DV (Y) was  posit . The IV (X) was  sex agree aware*agree . The mediating variable(s) =  aware .

Total effect(c) of  sex  on  posit  =  -2.68   S.E. =  0.55  t  =  -4.85  df=  511   with p =  0.0000016
Direct effect (c') of  sex  on  posit  removing  aware  =  -1.99   S.E. =  0.54  t  =  -3.71  df=  510   with p =  0.00023
Indirect effect (ab) of  sex  on  posit  through  aware   =  -0.68 
Mean bootstrapped indirect effect =  -0.67  with standard error =  0.2  Lower CI =  -1.08    Upper CI =  -0.3

Total effect(c) of  agree  on  posit  =  0.3   S.E. =  0.04  t  =  7.19  df=  511   with p =  0.0000000000023
Direct effect (c') of  agree  on  posit  removing  aware  =  0.08   S.E. =  0.05  t  =  1.54  df=  510   with p =  0.12
Indirect effect (ab) of  agree  on  posit  through  aware   =  0.22 
Mean bootstrapped indirect effect =  0.22  with standard error =  0.04  Lower CI =  0.13    Upper CI =  0.3

Total effect(c) of  aware*agree  on  posit  =  -0.03   S.E. =  0  t  =  -5.77  df=  511   with p =  0.000000014
Direct effect (c') of  aware*agree  on  posit  removing  aware  =  -0.01   S.E. =  0  t  =  -2.85  df=  510   with p =  0.0046
Indirect effect (ab) of  aware*agree  on  posit  through  aware   =  -0.01 
Mean bootstrapped indirect effect =  -0.01  with standard error =  0  Lower CI =  -0.02    Upper CI =  -0.01
R = 0.5 R2 = 0.25   F = 43.54 on 4 and 510 DF   p-value:  0.000000000000000000000000000000000000221 

 To see the longer output, specify short = FALSE in the print statement or ask for the summary

# psych::mediate(agree ~ posit + (aware), data = df_scales) # silly but works
# psych::mediate(agree ~ posit * aware, data = df_scales)

4.0.9 Reg step - everything about stigma is wacky

df_agree <- na.omit(df_scales[, c("agree", "sex", "age", "resid", "aware", "soc_supp", "posit")])
mod_agree <- lm(agree ~ sex + age + resid + aware + soc_supp, data = df_agree)
best_mod_agree <- step(mod_agree, scope = help_seek ~ .^2, direction = "both", data = mod_agree$model, trace = 0) # BIC with k = log(nrow(mod_agree$model))
summary(best_mod_agree)

Call:
lm(formula = agree ~ sex + aware + soc_supp + sex:aware, data = df_agree)

Residuals:
     Min       1Q   Median       3Q      Max 
-22.6459  -2.9557   0.6675   3.2232  15.9948 

Coefficients:
                  Estimate Std. Error t value             Pr(>|t|)    
(Intercept)        7.31728    1.32803   5.510         0.0000000591 ***
sexMasculin       -4.11805    1.53508  -2.683              0.00756 ** 
aware              0.42667    0.04509   9.463 < 0.0000000000000002 ***
soc_supp           0.52581    0.21332   2.465              0.01406 *  
sexMasculin:aware  0.26271    0.06650   3.950         0.0000899131 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.174 on 472 degrees of freedom
Multiple R-squared:  0.3897,    Adjusted R-squared:  0.3846 
F-statistic: 75.35 on 4 and 472 DF,  p-value: < 0.00000000000000022
df_helpseek <- na.omit(df_scales[, c("help_seek", "sex", "age", "agree", "aware", "soc_supp", "agree", "posit")])
mod_helpseek <- lm(help_seek ~ sex + age + agree  + aware + soc_supp, data = df_helpseek)
best_mod_helpseek <- step(mod_helpseek, scope = help_seek ~ .^2, direction = "both", data = mod_helpseek$model, trace = 0) # BIC with k = log(nrow(mod_helpseek$model))
summary(best_mod_helpseek)


summary(lm(help_seek ~ sex + age * aware, data = df_scales)) 


5 Session Info

 

A work by Claudiu Papasteri

 

LS0tDQp0aXRsZTogIjxicj4gU2Nob2xhcnMgd2F2ZSAxIC0gcGFydGlhbCBkYXRhIiANCnN1YnRpdGxlOiAiSW5pdGlhbCBBbmFseXNpcyINCmF1dGhvcjogIjxicj4gQ2xhdWRpdSBQYXBhc3RlcmkiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlbSAlWScpYCINCm91dHB1dDogDQogICAgaHRtbF9ub3RlYm9vazoNCiAgICAgICAgICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgICAgICAgICAgdG9jOiB0cnVlDQogICAgICAgICAgICB0b2NfZGVwdGg6IDINCiAgICAgICAgICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgICAgICAgICAgdGhlbWU6IHNwYWNlbGFiDQogICAgICAgICAgICBoaWdobGlnaHQ6IHRhbmdvDQogICAgICAgICAgICBmb250LWZhbWlseTogQXJpYWwNCiAgICAgICAgICAgIGZpZ193aWR0aDogMTANCiAgICAgICAgICAgIGZpZ19oZWlnaHQ6IDkNCiAgICAjIHBkZl9kb2N1bWVudDogDQogICAgICAgICAgICAjIHRvYzogdHJ1ZQ0KICAgICAgICAgICAgIyB0b2NfZGVwdGg6IDINCiAgICAgICAgICAgICMgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgICAgICAgICAjIGZvbnRzaXplOiAxMXB0DQogICAgICAgICAgICAjIGdlb21ldHJ5OiBtYXJnaW49MWluDQogICAgICAgICAgICAjIGZpZ193aWR0aDogNw0KICAgICAgICAgICAgIyBmaWdfaGVpZ2h0OiA2DQogICAgICAgICAgICAjIGZpZ19jYXB0aW9uOiB0cnVlDQogICAgIyBnaXRodWJfZG9jdW1lbnQ6IA0KICAgICAgICAgICAgIyB0b2M6IHRydWUNCiAgICAgICAgICAgICMgdG9jX2RlcHRoOiAyDQogICAgICAgICAgICAjIGh0bWxfcHJldmlldzogZmFsc2UNCiAgICAgICAgICAgICMgZmlnX3dpZHRoOiA1DQogICAgICAgICAgICAjIGZpZ19oZWlnaHQ6IDUNCiAgICAgICAgICAgICMgZGV2OiBqcGVnDQotLS0NCg0KDQo8IS0tIFNldHVwIC0tPg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBHZW5lcmFsIFIgb3B0aW9ucw0Kc2V0LnNlZWQoMTExKSAgICAgICAgICAgICAgICMgaW4gY2FzZSB3ZSB1c2UgcmFuZG9taXplZCBwcm9jZWR1cmVzICAgICAgIA0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICAgICAgICMgcG9zaXRpdmUgdmFsdWVzIGJpYXMgdG93YXJkcyBmaXhlZCBhbmQgbmVnYXRpdmUgdG93YXJkcyBzY2llbnRpZmljIG5vdGF0aW9uDQpvcHRpb25zKHJlcG9zID0gYyhnZXRPcHRpb24oInJlcG9zIilbIkNSQU4iXSwgQ1JBTmV4dHJhID0gImh0dHBzOi8vbWlycm9yLmNsaWVudHZwcy5jb20vQ1JBTi8iKSkgICMgdXNlIENSQU4gYXMgZGVmYXVsdCwgc2V0IENSQU5leHRyYSB0byBOw7xybmJlcmcgbWlycm9yDQoNCmlmICghcmVxdWlyZSgicGFjbWFuIikpIGluc3RhbGwucGFja2FnZXMoInBhY21hbiIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQppZiAoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQ0KcGFja2FnZXMgPC0gYygNCiAgInBhcGFqYSIsDQogICJoZXJlIiwgImZzIiwNCiAgImNvbmZsaWN0ZWQiLA0KICAicmlvIiwNCiAgInBzeWNoIiwgICAgICAgICAgDQogICJnZ3N0YXRzcGxvdCIsDQogICJnZ3Bsb3QyIiwgInNjYWxlcyIsDQogICJyZXBvcnQiLA0KICAiZ3RzdW1tYXJ5IiwNCiAgImxpbW9uYWlkIiwgInN0aWNreSINCiAgIyAsIC4uLg0KKQ0KcGFjbWFuOjpwX2xvYWQoY2hhciA9IHBhY2thZ2VzLCB1cGRhdGUgPSBGQUxTRSkNCg0KIyBTZXQgaGVyZSB0byBSbm90ZWJvb2sgZGlyZWN0b3J5DQpoZXJlOjpzZXRfaGVyZSgpDQp1bmxvYWROYW1lc3BhY2UoImhlcmUiKSAgICAgICAgICAgICAgICAgICAjIG5lZWQgbmV3IFIgc2Vzc2lvbiBvciB1bmxvYWQgbmFtZXNwYWNlIGZvciAuaGVyZSBmaWxlIHRvIHRha2UgcHJlY2VkZW5jZSBvdmVyIC5ScHJvag0Kbm90ZWJvb2tfbmFtZSA8LSBmczo6cGF0aF9maWxlKGhlcmU6OmhlcmUoKSkNCg0KIyBTb2x2ZSBjb25mbGljdHMgaW4gZmF2b3Igb2YgdGlkeXZlcnNlDQpjb25mbGljdGVkOjpjb25mbGljdF9wcmVmZXIoImZpbHRlciIsIHdpbm5lciA9ICJkcGx5ciIpDQpjb25mbGljdGVkOjpjb25mbGljdF9wcmVmZXIoInNlbGVjdCIsIHdpbm5lciA9ICJkcGx5ciIpDQpjb25mbGljdGVkOjpjb25mbGljdF9wcmVmZXIoInNsaWNlIiwgd2lubmVyID0gImRwbHlyIikNCmNvbmZsaWN0ZWQ6OmNvbmZsaWN0X3ByZWZlcigicmVuYW1lIiwgd2lubmVyID0gImRwbHlyIikNCmNvbmZsaWN0ZWQ6OmNvbmZsaWN0X3ByZWZlcigiY291bnQiLCB3aW5uZXIgPSAiZHBseXIiKQ0KY29uZmxpY3RlZDo6Y29uZmxpY3RfcHJlZmVyKCJyZWNvZGUiLCB3aW5uZXIgPSAiZHBseXIiKQ0KY29uZmxpY3RlZDo6Y29uZmxpY3RfcHJlZmVyKCJmaWxsIiwgd2lubmVyID0gInRpZHlyIikNCg0KIyBTZXQga2ludHIgb3B0aW9ucyBpbmNsdWRpbmcgcm9vdC5kaXIgcG9pbnRpbmcgdG8gdGhlIC5oZXJlIGZpbGUgaW4gUm5vdGVib29rIGRpcmVjdG9yeQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICByb290LmRpciA9IGhlcmU6OmhlcmUoKSwNCiAgI2ZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLzMsIA0KICBjb21tZW50ID0gIiMiLA0KICBjb2xsYXBzZSA9IFRSVUUsDQogIGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gVFJVRSwgbWVzc2FnZSA9IFRSVUUsIGNhY2hlID0gVFJVRSAgICAgICAjIGVjaG8gPSBGYWxzZSBmb3IgZ2l0aHViX2RvY3VtZW50LCBidXQgd2lsbCBiZSBmb2xkZWQgaW4gaHRtbF9ub3RlYm9vaw0KKQ0KDQojIFRoZW1lcyBmb3IgZ2dwbG90MiBwbG90dGluZyAoaGVyZSB1c2VkIEFQQSBzdHlsZSkNCnRoZW1lX3NldChwYXBhamE6OnRoZW1lX2FwYSgpKQ0KYGBgDQoNCg0KDQoNCg0KPCEtLSBGdW5jdGlvbnMgLS0+DQoNCiMgRGVmaW5lIGZ1bmN0aW9ucw0KDQpgYGB7cn0NCiMjIERlZmluZSBmdW5jdGlvbiB0aGF0IHJlY29kZXMgdG8gbnVtZXJpYywgYnV0IHdhdGNoZXMgb3V0IHRvIGNvZXJjaW9uIHRvIG5vdCBpbnRyb2R1Y2UgTkFzDQpjb2xzdG9udW1lcmljIDwtIGZ1bmN0aW9uKGRmKXsNCiAgdHJ5Q2F0Y2goew0KICAgIGRmX251bSA8LSBhcy5kYXRhLmZyYW1lKA0KICAgICAgbGFwcGx5KGRmLA0KICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHsgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoeCkpfSkpIA0KICB9LHdhcm5pbmcgPSBmdW5jdGlvbihzdG9wX29uX3dhcm5pbmcpIHsNCiAgICBtZXNzYWdlKCJTdG9wZWQgdGhlIGV4ZWN1dGlvbiBvZiBudW1lcmljIGNvbnZlcnNpb246ICIsIGNvbmRpdGlvbk1lc3NhZ2Uoc3RvcF9vbl93YXJuaW5nKSkNCiAgfSkgDQp9DQojIw0KIyMgRGVmaW5lIGZ1bmN0aW9uIHRoYXQgcmV2ZXJzZSBjb2RlcyBpdGVtcw0KUmV2ZXJzZUNvZGUgPC0gZnVuY3Rpb24oZGYsIHRvbnVtZXJpYyA9IEZBTFNFLCBtaW4gPSBOVUxMLCBtYXggPSBOVUxMKSB7DQogIGlmKHRvbnVtZXJpYykgZGYgPC0gY29sc3RvbnVtZXJpYyhkZikNCiAgZGYgPC0gKG1heCArIG1pbikgLSBkZg0KfQ0KIyMNCiMjIERlZmluZSBmdW5jdGlvbiB0aGF0IHNjb3JlcyBvbmx5IHJvd3Mgd2l0aCBsZXNzIHRoYW4gMTAlIE5BcyAocmV0dXJucyBOQSBpZiBhbGwgb3IgYWJvdmUgdGhyZXNob2xkIHBlcmNlbnRhZ2Ugb2Ygcm93cyBhcmUgTkEpOyBjYW4gcmV2ZXJzZSBjb2RlIGlmIHZlY3RvciBvZiBjb2x1bW4gaW5kZXhlcyBhbmQgbWluLCBtYXggYXJlIHByb3ZpZGVkLg0KU2NvcmVMaWtlcnQgPC0gZnVuY3Rpb24oZGYsIG5hcGVyY2VudCA9IC4xLCB0b251bWVyaWMgPSBGQUxTRSwgcmV2ZXJzZWNvbHMgPSBOVUxMLCBtaW4gPSBOVUxMLCBtYXggPSBOVUxMLCBlbmdpbmUgPSAic3VtIikgew0KICByZXZlcnNlX2xpc3QgPC0gbGlzdChyZXZlcnNlY29scyA9IHJldmVyc2Vjb2xzLCBtaW4gPSBtaW4sIG1heCA9IG1heCkNCiAgcmV2ZXJzZV9jaGVjayA8LSAhc2FwcGx5KHJldmVyc2VfbGlzdCwgaXMubnVsbCkNCiAgDQogICMgUmVjb2RlIHRvIG51bWVyaWMsIGJ1dCB3YXRjaCBvdXQgdG8gY29lcmNpb24gdG8gbm90IGludHJvZHVjZSBOQXMNCiAgY29sc3RvbnVtZXJpYyA8LSBmdW5jdGlvbihkZil7DQogICAgdHJ5Q2F0Y2goew0KICAgICAgZGZfbnVtIDwtIGFzLmRhdGEuZnJhbWUoDQogICAgICAgIGxhcHBseShkZiwNCiAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHsgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoeCkpfSkpIA0KICAgIH0sd2FybmluZyA9IGZ1bmN0aW9uKHN0b3Bfb25fd2FybmluZykgew0KICAgICAgbWVzc2FnZSgiU3RvcGVkIHRoZSBleGVjdXRpb24gb2YgbnVtZXJpYyBjb252ZXJzaW9uOiAiLCBjb25kaXRpb25NZXNzYWdlKHN0b3Bfb25fd2FybmluZykpDQogICAgfSkgDQogIH0NCiAgDQogIGlmKHRvbnVtZXJpYykgZGYgPC0gY29sc3RvbnVtZXJpYyhkZikNCiAgDQogIGlmKGFsbChyZXZlcnNlX2NoZWNrKSl7DQogICAgZGZbICxyZXZlcnNlY29sc10gPC0gKG1heCArIG1pbikgLSBkZlsgLHJldmVyc2Vjb2xzXQ0KICB9ZWxzZSBpZihhbnkocmV2ZXJzZV9jaGVjaykpew0KICAgIHN0b3AoIkluc3VmaWNpZW50IGluZm8gZm9yIHJldmVyc2luZy4gUGxlYXNlIHByb3ZpZGU6ICIsIHBhc3RlKG5hbWVzKHJldmVyc2VfbGlzdClbIXJldmVyc2VfY2hlY2tdLCBjb2xsYXBzZSA9ICIsICIpKQ0KICB9DQogIA0KICBpZihlbmdpbmUgPT0gInN1bSIpIHsNCiAgICByZXR1cm4oDQogICAgICBpZmVsc2Uocm93U3Vtcyhpcy5uYShkZikpID4gbmNvbChkZikgKiBuYXBlcmNlbnQsDQogICAgICAgICAgICAgTkEsDQogICAgICAgICAgICAgcm93U3VtcyhkZiwgbmEucm0gPSBUUlVFKSAqIE5BIF4gKHJvd1N1bXMoIWlzLm5hKGRmKSkgPT0gMCkNCiAgICAgICkNCiAgICApICANCiAgfQ0KICANCiAgaWYoZW5naW5lID09ICJtZWFuIikgew0KICAgIHJldHVybigNCiAgICAgIGlmZWxzZShyb3dNZWFucyhpcy5uYShkZikpID4gbmNvbChkZikgKiBuYXBlcmNlbnQsDQogICAgICAgICAgICAgTkEsDQogICAgICAgICAgICAgcm93TWVhbnMoZGYsIG5hLnJtID0gVFJVRSkgKiBOQSBeIChyb3dTdW1zKCFpcy5uYShkZikpID09IDApDQogICAgICApICAgICAgIA0KICAgICkNCiAgfQ0KICANCiAgICBpZihlbmdpbmUgPT0gIm1lYW5fbmEiKSB7DQogICAgICBkZltpcy5uYShkZildIDwtIDANCiAgICAgIHJvd01lYW5zKGRmKQ0KICAgIH0NCn0NCmBgYA0KDQoNCg0KPCEtLSBSZXBvcnQgLS0+DQoNCiMgUmVhZCBzdXJ2ZXkgc3RydWN0dXJlDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KZm9sZGVyIDwtIGhlcmU6OmhlcmUoIlJzeW50YXgmZGF0YSIpDQpkYXRhX25hbWUgPC0gInN1cnZleV82ODY3MzJfUl9kYXRhX2ZpbGUuY3N2Ig0Kc2NyaXB0X25hbWUgPC0gInN1cnZleV82ODY3MzJfUl9zeW50YXhfZmlsZS5SIg0KICANCiMgQ2hlY2sgbW9zdCByZWNlbnQgLmNzdiBmaWxlDQpsYXN0X2Nzdl9maWxlIDwtIA0KICBkaXIoZm9sZGVyLCBwYXR0ZXJuID0gIi4qY3N2IiwgZnVsbC5uYW1lcyA9IFRSVUUpICU+JSANCiAgZmlsZS5pbmZvKCkgJT4lDQogIGRwbHlyOjphcnJhbmdlKGRwbHlyOjpkZXNjKGN0aW1lKSkgJT4lDQogIGRwbHlyOjpzbGljZSgxKSAlPiUNCiAgcm93Lm5hbWVzKCkNCmlmKGlkZW50aWNhbChsYXN0X2Nzdl9maWxlLCBmaWxlLnBhdGgoZm9sZGVyLCBkYXRhX25hbWUpKSkgew0KICBjYXQoIk1vc3QgcmVjZW50IC5jc3YgaXMgdXNlZC4iKQ0KfSBlbHNlIHsNCiAgY2F0KCJOT1QgdXNpbmcgdGhlIG1vc3QgcmVjZW50IC5jc3YhIikNCn0NCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIFJlYWQgZGF0YQ0KbGlicmFyeShsaW1vbmFpZCkNCmxpYnJhcnkoc3RpY2t5KSAgIyBuZWVkIHRoaXMgZm9yIHN0aWNreSBsYWJlbHMNCg0KZGYgPC0gbGltb25haWQ6OmxzX2ltcG9ydF9kYXRhKA0KICBkYXRhZmlsZSA9IGZpbGUucGF0aChmb2xkZXIsIGRhdGFfbmFtZSksDQogIHNjcmlwdGZpbGUgPSBmaWxlLnBhdGgoZm9sZGVyLCBzY3JpcHRfbmFtZSksDQogIG1hc3NDb252ZXJ0VG9OdW1lcmljID0gRkFMU0UNCikNCg0KZGZfY29tcGwgPC0NCiAgZGYgJT4lDQogIGZpbHRlcihsYXN0cGFnZSA9PSAxNykNCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIExhYmVscyB0byBmYWN0b3IgbGV2ZWxzIGxldmVscyAoImxhYmVsIiA9IHF1ZXN0aW9uIHRleHQ7ICJsYWJlbHMiID0gcmVzcG9uc2Ugb3B0aW9ucyB0ZXh0KQ0KIyBsaWJyYXJ5KGxhYmVsbGVkKQ0KIyBsaWJyYXJ5KHNqbGFiZWxsZWQpDQojIHNqbGFiZWxsZWQ6OmdldF9sYWJlbHMoZGYkRzAxUTU5X1NRMDA4LCBhdHRyLm9ubHkgPSBUUlVFLCB2YWx1ZXMgPSAiYXMucHJlZml4IikNCiMgc2psYWJlbGxlZDo6Z2V0X3ZhbHVlcyhkZiRHMDFRNTlfU1EwMDgpDQojIHNqbGFiZWxsZWQ6OmFzX2xhYmVsKGRmJEcwMVE1OV9TUTAwOCwgcHJlZml4ID0gVFJVRSwga2VlcC5sYWJlbHMgPSBUUlVFKSANCiMgc2psYWJlbGxlZDo6YXNfY2hhcmFjdGVyKGRmJEcwMVE1OV9TUTAwOCwgcHJlZml4ID0gVFJVRSwga2VlcC5sYWJlbHMgPSBUUlVFKQ0KIyBsYWJlbGxlZDo6dmFyX2xhYmVsKGRmJEcwMVE1OV9TUTAwOCkNCiMgbGFiZWxsZWQ6OnRvX2ZhY3RvcihkZiRHMDFRNTlfU1EwMDgsIGxldmVscyA9ICJ2YWx1ZXMiKQ0KDQpsaW1lX2xhYmVsX3JlY29kZSA8LSBmdW5jdGlvbiAoeCwgcHJlZml4ID0gRkFMU0UpIHsNCiAgbGFiZWxzIDwtIGF0dHIoeCwgImxhYmVscyIsIGV4YWN0ID0gVFJVRSkNCiAgaWYgKGlzLm51bGwobGFiZWxzKSkgew0KICAgIHgNCiAgfSBlbHNlIHsNCiAgICBsYWJlbHMgPC0gdW5uYW1lKGxhYmVscykNCiAgICB2YWx1ZXMgPC0gbmFtZXMoYXR0cih4LCAibGFiZWxzIiwgZXhhY3QgPSBUUlVFKSkNCiAgICBpZiAocHJlZml4KSB7DQogICAgICBsYWJlbHMgPC0gc3ByaW50ZigiWyVzXSAlcyIsIHZhbHVlcywgbGFiZWxzKQ0KICAgIH0NCiAgICAjIE5vIHJlY29kaW5nIHNvbHV0aW9uIHByZXNlcnZlIGF0dHJpYnV0ZXMsIGV2ZW4gd2l0aCBzdGlja3kNCiAgICAgIHhfcmVjIDwtIGMobGFiZWxzLCB4KVttYXRjaCh4LCBjKHZhbHVlcywgeCkpXQ0KICAgIGF0dHJpYnV0ZXMoeF9yZWMpIDwtIGF0dHJpYnV0ZXMoeCkgICMgcmVhdHRhY2ggYXR0cmlidXRlcw0KICAgIHhfcmVjDQogIH0NCn0NCiMgdGVzdF9kZiA8LSBjYmluZChkZiRHMDJRMDJfU1EwMjEsIGxpbWVfbGFiZWxfcmVjb2RlKGRmJEcwMlEwMl9TUTAyMSkpDQojIGxpbWVfbGFiZWxfcmVjb2RlKGRmJEcwMVE1OV9TUTAwOCkNCiMgbGltZV9sYWJlbF9yZWNvZGUoZGYkRzA0UTA1X1NRMDAxKQ0KDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgUmVjb2RlIHVzaW5nIGxhYmVscw0KIyBjb2xzX3RvX3JlY29kZSA8LSBsYXBwbHkoZGYsIGZ1bmN0aW9uKHgpIHshaXMubnVsbChhdHRyKHgsICJsYWJlbHMiLCBleGFjdCA9IFRSVUUpKX0pDQojIGNvbHNfdG9fcmVjb2RlIDwtIHdoaWNoKHVubGlzdChjb2xzX3RvX3JlY29kZSkpDQoNCiMgZGZfcmVjb2RlZCA8LSBkZg0KIyBsaXN0X3JlY29kZWQgPC0gbGFwcGx5KGRmX3JlY29kZWRbLCBjb2xzX3RvX3JlY29kZV0sIGxpbWVfbGFiZWxfcmVjb2RlKQ0KIyBkZl9yZWNvZGVkWywgY29sc190b19yZWNvZGVdIDwtIGFzLmRhdGEuZnJhbWUoZG8uY2FsbChjYmluZCwgbGlzdF9yZWNvZGVkKSkNCg0KIyBkZl9yZWNvZGVkIDwtDQojICAgZGYgJT4lDQojICAgbXV0YXRlKGFjcm9zcyhhbGxfb2YoY29sc190b19yZWNvZGUpLCBsaW1lX2xhYmVsX3JlY29kZSkpIA0KDQpkZl9yZWNvZGVkIDwtDQogIGRmICU+JQ0KICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgbGltZV9sYWJlbF9yZWNvZGUpKSAlPiUgICAjIHNvbWUgdmFsdWVzIGhhdmUgc2FtZSBsYWJlbHM6IGRmJEcwMVE2MF9TUTAwNg0KICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLmNoYXJhY3RlciksIGZ1bmN0aW9uKGNvbCkgaWNvbnYoY29sLCB0bz0iVVRGLTgiKSkpICAjIGVuY29kaW5nOiBkZl9yZWNvZGVkJEcwMVE1Ng0KYGBgDQoNCg0KDQojIFNjb3JlIDMgUXVlc3Rpb25uYWlyZXMNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBEZWZpbmUgMyBzY2FsZXMNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIEFUU1BQSCAtIDEwIGl0ZW1zIChsaWtlcnQgMC0zKSB0b3RhbCBzdW0NCmF0c3BwaF9pZHggPC0gMTg0OjE5MyAgIyBncmVwKCJHMDZRMTMiLCBuYW1lcyhkZikpOyAgZGZbLCBncmVwKCJHMDZRMTMiLCBuYW1lcyhkZiksIHZhbHVlID0gVFJVRSldDQphdHNwcGhfbGFicyA8LSB1bmlxdWUobGFwcGx5KGRmWywgYXRzcHBoX2lkeF0sIGF0dHIsICJsYWJlbHMiKSkNCmF0c3BwaF9yZXYgPC0gYygyLCA0LCA4LCA5LCAxMCkNCg0KYXRzcHBoX3JlY29kZSA8LSBmdW5jdGlvbihkZiwgcmV2KSB7DQogIGRmICU+JQ0KICAgIG11dGF0ZSgNCiAgICAgIGFjcm9zcyhldmVyeXRoaW5nKCksDQogICAgICAgIH4gY2FzZV93aGVuKA0KICAgICAgICAgIC4gPT0gIkFPMDIiIH4gMCwNCiAgICAgICAgICAuID09ICJBTzAzIiB+IDEsDQogICAgICAgICAgLiA9PSAiQU8wNCIgfiAyLA0KICAgICAgICAgIC4gPT0gIkFPMDUiIH4gMw0KICAgICAgICApDQogICAgICApICAgICAgIA0KICAgICkgJT4lDQogICAgbXV0YXRlKCAgICMgaGVyZSByZXZlcnNlIGNvZGUNCiAgICAgIGFjcm9zcyhyZXYsDQogICAgICB+IDMgLSAueCANCiAgICAgICkNCiAgICApDQp9ICAjIGF0c3BwaF9yZWNvZGUoZGZfY29tcGxbLCBhdHNwcGhfaWR4XSwgYXRzcHBoX3JldikNCg0KIyBGU296VSAtIDYgaXRlbXMgKGxpa2VydCAxLTUpIHRvdGFsIG1lYW4NCmZzb3p1X2lkeCA8LSAyMjI6MjI3ICMgZ3JlcCgiRzEyUTQ1IiwgbmFtZXMoZGYpKTsgZGZbLCBncmVwKCJHMTJRNDUiLCBuYW1lcyhkZiksIHZhbHVlID0gVFJVRSldICANCmZzb3p1X2xhYnMgPC0gdW5pcXVlKGxhcHBseShkZlssIGZzb3p1X2lkeF0sIGF0dHIsICJsYWJlbHMiKSkgIA0KDQpmc296dV9yZWNvZGUgPC0gZnVuY3Rpb24oZGYpIHsNCiAgZGYgJT4lDQogICAgbXV0YXRlKA0KICAgICAgYWNyb3NzKGV2ZXJ5dGhpbmcoKSwNCiAgICAgICAgfiBjYXNlX3doZW4oDQogICAgICAgICAgLiA9PSAiQU8wMSIgfiAxLA0KICAgICAgICAgIC4gPT0gIkFPMDIiIH4gMiwNCiAgICAgICAgICAuID09ICJBTzAzIiB+IDMsDQogICAgICAgICAgLiA9PSAiQU8wNCIgfiA0LA0KICAgICAgICAgIC4gPT0gIkFPMDUiIH4gNQ0KICAgICAgICApDQogICAgICApICAgICAgIA0KICAgICkgDQp9ICAjIGZzb3p1X3JlY29kZShkZl9jb21wbFssIGZzb3p1X2lkeF0pDQoNCiMgUE1IU1MgLSAyNCBpdGVtcyAobGlrZXJ0IDEtNSkgc3Vic2NhbGUgc3VtDQpwbWhzc19pZHggPC0gMjI4OjI1MSAgICMgZ3JlcCgiRzEzUTQ2IiwgbmFtZXMoZGYpKTsgZGZbLCBncmVwKCJHMTNRNDYiLCBuYW1lcyhkZiksIHZhbHVlID0gVFJVRSldDQpwbWhzc19sYWJzIDwtIHVuaXF1ZShsYXBwbHkoZGZbLCBwbWhzc19pZHhdLCBhdHRyLCAibGFiZWxzIikpDQoNCnBtaHNzX2F3YXJlIDwtIGMoMiwgNCwgNSwgNiwgOCwgMTAsIDExLCAxMikgIA0KcG1oc3NfYWdyZWUgPC0gYygxNCwgMTYsIDE3LCAxOCwgMjAsIDIyLCAyMywgMjQpIA0KcG1oc3NfcG9zaXQgPC0gYygxLCAzLCA3LCA5LCAxMywgMTUsIDE5LCAyMSkNCg0KcG1oc3NfcmVjb2RlIDwtIGZ1bmN0aW9uKGRmKSB7DQogIGRmICU+JQ0KICAgIG11dGF0ZSgNCiAgICAgIGFjcm9zcyhldmVyeXRoaW5nKCksDQogICAgICAgIH4gY2FzZV93aGVuKA0KICAgICAgICAgIC4gPT0gIkFPMDEiIH4gMSwNCiAgICAgICAgICAuID09ICJBTzAyIiB+IDIsDQogICAgICAgICAgLiA9PSAiQU8wMyIgfiAzLA0KICAgICAgICAgIC4gPT0gIkFPMDQiIH4gNCwNCiAgICAgICAgICAuID09ICJBTzA1IiB+IDUNCiAgICAgICAgKQ0KICAgICAgKSAgICAgICANCiAgICApDQp9ICAjIHBtaHNzX3JlY29kZShkZl9jb21wbFssIHBtaHNzX2lkeF0pDQoNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIFJlY29kZSAmIFNjb3JlDQpkZl9jb21wbFssIGF0c3BwaF9pZHhdIDwtIGF0c3BwaF9yZWNvZGUoZGZfY29tcGxbLCBhdHNwcGhfaWR4XSwgYXRzcHBoX3JldikNCmRmX2NvbXBsWywgZnNvenVfaWR4XSA8LSBmc296dV9yZWNvZGUoZGZfY29tcGxbLCBmc296dV9pZHhdKQ0KZGZfY29tcGxbLCBwbWhzc19pZHhdIDwtIHBtaHNzX3JlY29kZShkZl9jb21wbFssIHBtaHNzX2lkeF0pDQoNCmRmX2NvbXBsJGhlbHBfc2VlayA8LSBTY29yZUxpa2VydChkZl9jb21wbFssIGF0c3BwaF9pZHhdLCBuYXBlcmNlbnQgPSAuNSwgZW5naW5lID0gInN1bSIpDQpkZl9jb21wbCRzb2Nfc3VwcCA8LSBTY29yZUxpa2VydChkZl9jb21wbFssIGZzb3p1X2lkeF0sIG5hcGVyY2VudCA9IC41LCBlbmdpbmUgPSAibWVhbiIpDQoNCmRmX2NvbXBsJGF3YXJlIDwtIFNjb3JlTGlrZXJ0KGRmX2NvbXBsWywgcG1oc3NfaWR4XVtwbWhzc19hd2FyZV0sIG5hcGVyY2VudCA9IC41LCBlbmdpbmUgPSAic3VtIikgDQpkZl9jb21wbCRhZ3JlZSA8LSBTY29yZUxpa2VydChkZl9jb21wbFssIHBtaHNzX2lkeF1bcG1oc3NfYWdyZWVdLCBuYXBlcmNlbnQgPSAuNSwgZW5naW5lID0gInN1bSIpDQpkZl9jb21wbCRwb3NpdCA8LSBTY29yZUxpa2VydChkZl9jb21wbFssIHBtaHNzX2lkeF1bcG1oc3NfcG9zaXRdLCBuYXBlcmNlbnQgPSAuNSwgZW5naW5lID0gInN1bSIpDQpgYGANCg0KDQojIFNvbWUgYW5hbHlzZXMgb24gMyBRdWVzdGlvbm5haXJlcw0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnZhcnNfZGVtb2cgPC0gYygiUTAwIiwgIkcwMVEyMyIsICJHMDFRMjQiLCAiRzAxUTI2IikNCnZhcnNfZGVtb2dfbmFtZXMgPC0gYygic2V4IiwgInllYXJfYmlydGgiLCAiZ3JhZGUiLCAicmVzaWQiKQ0KbGFwcGx5KGRmX2NvbXBsWywgdmFyc19kZW1vZ10sIGF0dHIsICJsYWJlbCIpDQoNCmRmX3NjYWxlcyA8LSANCiAgZGZfY29tcGwgJT4lDQogICMgbGFiZWxsZWQ6OnJlbW92ZV9hdHRyaWJ1dGVzKCJsYWJlbCIpICU+JQ0KICAjIGxhYmVsbGVkOjpyZW1vdmVfYXR0cmlidXRlcygibGFiZWxzIikgJT4lDQogIHJlbmFtZV93aXRoKH4gYyh2YXJzX2RlbW9nX25hbWVzKSwgYWxsX29mKHZhcnNfZGVtb2cpKSAlPiUNCiAgc2VsZWN0KGFsbF9vZih2YXJzX2RlbW9nX25hbWVzKSwNCiAgICAgICAgIGhlbHBfc2Vlaywgc29jX3N1cHAsIGF3YXJlLCBhZ3JlZSwgcG9zaXQpICU+JQ0KICBtdXRhdGUoYWNyb3NzKGFsbF9vZih2YXJzX2RlbW9nX25hbWVzKSwgbGltZV9sYWJlbF9yZWNvZGUpKSAlPiUNCiAgbXV0YXRlKGFnZSA9IDIwMjMgLSBhcy5udW1lcmljKHllYXJfYmlydGgpKQ0KYGBgDQoNCiMjIyBKdXN0IGNoZWNrcw0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEwfQ0KcGxvdF9zY2FsZXMgPC0gR0dhbGx5OjpnZ3BhaXJzKGRmX3NjYWxlc1ssIGMoMSwgMTAsIDM6OSldLCBwcm9ncmVzcyA9IEZBTFNFKQ0KcGxvdF9zY2FsZXMNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9N30NCnBsb3Rfc2NhbGVzMiA8LSBQZXJmb3JtYW5jZUFuYWx5dGljczo6Y2hhcnQuQ29ycmVsYXRpb24oZGZfc2NhbGVzWywgYygxMCwgNTo5KV0pDQpwbG90X3NjYWxlczINCmBgYA0KDQoNCiMjIyBNb2QgLSBqdXN0IGNoZWNrDQoNCmBgYHtyIG1vZCwgY2FjaGU9VFJVRX0NCiMgZmluZF9tb2QoZGZfc2NhbGVzKQ0KIyBtb2RlcmF0aW9uX21vZGVsX2xpc3QgIzEsMiwzLDYsNywxMCwxMSwxMg0KDQptb2Rfc3ludGggPC0NCiAgbW9kZXJhdGlvbl9tb2RlbF9saXN0ICU+JQ0KICBwdXJycjo6cGx1Y2soIlN5bnRheCIpICU+JQ0KICBzdHJpbmdyOjpzdHJfbWF0Y2goIiMgUmVncmVzc2lvbnNcXFxuKC4qPylcXFxuXFxcbiMiKSAlPiUgICAjIHN0cmluZyBiZXR3ZWVuICIjIFJlZ3Jlc3Npb25zXG4iIGFuZCAiXG5cbiMiDQogIGFzLmRhdGEuZnJhbWUoKSAlPiUNCiAgZHBseXI6OnB1bGwoMikgJT4lIA0KICBzdHJpbmdyOjpzdHJfcmVtb3ZlX2FsbChmaXhlZCgiYjAqMSArICIpKSANCg0KbW9kX3RhYmwgPC0gDQogIG1vZGVyYXRpb25fbW9kZWxfbGlzdCAlPiUNCiAgcHVycnI6OnBsdWNrKCJNb2RlbCIpDQoNCmZvcihpIGluIHNlcV9sZW4obGVuZ3RoKG1vZF90YWJsKSkpIHtwcmludChtb2Rfc3ludGhbaV0pOyBwcmludChtb2RfdGFibFtbaV1dKX0NCmBgYA0KDQojIyMgTWVkIC0ganVzdCBjaGVjaw0KDQpgYGB7ciBtZWQsIGNhY2hlPVRSVUV9DQojIGZpbmRfbWVkKGRmX3NjYWxlcykNCiMgbWVkaWF0aW9uX21vZGVsX2xpc3QNCg0KZm9yKGkgaW4gc2VxX2xlbihsZW5ndGgobWVkaWF0aW9uX21vZGVsX2xpc3QkTWVkRXMpKSkge3ByaW50KG1lZGlhdGlvbl9tb2RlbF9saXN0JE1lZEVzW2ldKTsgcHJpbnQobWVkaWF0aW9uX21vZGVsX2xpc3QkUGF0aEVzW1tpXV0pfQ0KYGBgDQoNCiMjIyBPZGQgc3RpZ21hIHBhdHRlcm5zDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD03fQ0KZ2dwbG90KGRmX3NjYWxlcywgYWVzKGF3YXJlLCBhZ3JlZSwgY29sb3IgPSBwb3NpdCkpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgZm9ybXVsYSA9IHkgfiB4LCBzZSA9IFRSVUUsIGFscGhhID0gMC4xLCBjb2xvciA9ICJyZWQiLCBmaWxsID0gInJlZCIpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgc2NhbGVfY29sb3VyX2Rpc3RpbGxlcihwYWxldHRlID0gIkJsdWVzIiwgZGlyZWN0aW9uID0gMSkNCg0KZGZfc2NhbGVzICU+JQ0KICBtdXRhdGUocG9zaXRfY2F0ID0gY3V0KHBvc2l0LA0KICAgIGJyZWFrcyA9IGMoNSwgMTAsIDIwLCAzMCwgNDApKQ0KICApICU+JQ0KICBnZ3Bsb3QoYWVzKGF3YXJlLCBhZ3JlZSwgY29sb3IgPSBwb3NpdF9jYXQpKSArDQogIGdlb21fcG9pbnQoKSAtPiBwbG90X3N0aWdtYTENCnBsb3RseTo6Z2dwbG90bHkocGxvdF9zdGlnbWExKQ0KDQpnZ3Bsb3QoZGZfc2NhbGVzLCBhZXMocG9zaXQsIGFncmVlLCBjb2xvciA9IGF3YXJlKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBmb3JtdWxhID0geSB+IHgsIHNlID0gVFJVRSwgYWxwaGEgPSAwLjEsIGNvbG9yID0gInJlZCIsIGZpbGwgPSAicmVkIikgKw0KICBnZW9tX3BvaW50KCkgKw0KICBzY2FsZV9jb2xvdXJfZGlzdGlsbGVyKHBhbGV0dGUgPSAiQmx1ZXMiLCBkaXJlY3Rpb24gPSAxKQ0KDQpkZl9zY2FsZXMgJT4lDQogIG11dGF0ZShhd2FyZV9jYXQgPSBjdXQocG9zaXQsDQogICAgYnJlYWtzID0gYyg1LCAxMCwgMjAsIDMwLCA0MCkpDQogICkgJT4lDQogIGdncGxvdChhZXMocG9zaXQsIGFncmVlLCBjb2xvciA9IGF3YXJlX2NhdCkpICsNCiAgZ2VvbV9wb2ludCgpIC0+IHBsb3Rfc3RpZ21hMg0KcGxvdGx5OjpnZ3Bsb3RseShwbG90X3N0aWdtYTIpDQoNCmNvcGxvdChhZ3JlZSB+IHBvc2l0IHwgYXdhcmUsIG92ZXJsYXAgPSAwLCBkYXRhID0gZGZfc2NhbGVzLA0KICBwYW5lbCA9IGZ1bmN0aW9uKHgsIHksIC4uLikgew0KICAgICAgICAgIHBvaW50cyh4LCB5LCAuLi4pDQogICAgICAgICAgYWJsaW5lKGxtKHkgfiB4KSwgY29sID0gInJlZCIpfQ0KKQ0KYGBgDQoNCiMjIyBQYXJ0aWFsIGNvcnJlbGF0aW9ucyBzdGlnbWEgKHBhcnRpYWwgZXZlcnl0aGluZyBmcm9tIGV2ZXJ5dGhpbmcpDQoNCmBgYHtyfQ0KcHN5Y2g6Omxvd2VyTWF0KHBzeWNoOjpwYXJ0aWFsLnIoZGZfc2NhbGVzWywgYygiYWdyZWUiLCAiYXdhcmUiLCAicG9zaXQiKV0pKQ0KYGBgDQoNCg0KIyMjIEludGVyYWN0aW9uIHN0aWdtYQ0KDQpgYGB7cn0NCm1vZF9zdGlnbWFfaW50ZXJhYyA8LSBsbShhZ3JlZSB+IGF3YXJlICogcG9zaXQsIGRhdGEgPSBkZl9hZ3JlZSkNCmludGVyYWN0aW9uczo6aW50ZXJhY3RfcGxvdChtb2Rfc3RpZ21hX2ludGVyYWMsIHByZWQgPSBwb3NpdCwgbW9keCA9IGF3YXJlKQ0KIyBpbnRlcmFjdGlvbnM6OnNpbV9zbG9wZXMobW9kX3N0aWdtYV9pbnRlcmFjLCBwcmVkID0gcG9zaXQsIG1vZHggPSBhd2FyZSkNCmBgYA0KDQojIyMgR2VuZGVyIGRpZmYgc3RpZ21hDQoNCmBgYHtyfQ0KZ2dzdGF0c3Bsb3Q6OmdnYmV0d2VlbnN0YXRzKGRmX2FncmVlLCB4ID0gc2V4LCB5ID0gYWdyZWUpDQpnZ3N0YXRzcGxvdDo6Z2diZXR3ZWVuc3RhdHMoZGZfYWdyZWUsIHggPSBzZXgsIHkgPSBhd2FyZSkNCmdnc3RhdHNwbG90OjpnZ2JldHdlZW5zdGF0cyhkZl9hZ3JlZSwgeCA9IHNleCwgeSA9IHBvc2l0KQ0KYGBgDQoNCiMjIyBTaWxseSBtb2RlbCB0aGF0IHdvcmtzIHNtaCAoMCBtLCAxIGZlbSkNCg0KYGBge3J9DQpkZl9zY2FsZXMgJT4lIA0KICBtdXRhdGUoc2V4ID0gYXMubnVtZXJpYyhhcy5mYWN0b3Ioc2V4KSkgLSAxKSAlPiUgDQogIHBzeWNoOjptZWRpYXRlKHBvc2l0IH4gc2V4ICsgYXdhcmU6YWdyZWUgKyAoYXdhcmUpLCBkYXRhID0gLikNCg0KIyBwc3ljaDo6bWVkaWF0ZShhZ3JlZSB+IHBvc2l0ICsgKGF3YXJlKSwgZGF0YSA9IGRmX3NjYWxlcykgIyBzaWxseSBidXQgd29ya3MNCiMgcHN5Y2g6Om1lZGlhdGUoYWdyZWUgfiBwb3NpdCAqIGF3YXJlLCBkYXRhID0gZGZfc2NhbGVzKQ0KYGBgDQoNCiMjIyBSZWcgc3RlcCAtIGV2ZXJ5dGhpbmcgYWJvdXQgc3RpZ21hIGlzIHdhY2t5DQoNCmBgYHtyfQ0KZGZfYWdyZWUgPC0gbmEub21pdChkZl9zY2FsZXNbLCBjKCJhZ3JlZSIsICJzZXgiLCAiYWdlIiwgInJlc2lkIiwgImF3YXJlIiwgInNvY19zdXBwIiwgInBvc2l0IildKQ0KbW9kX2FncmVlIDwtIGxtKGFncmVlIH4gc2V4ICsgYWdlICsgcmVzaWQgKyBhd2FyZSArIHNvY19zdXBwLCBkYXRhID0gZGZfYWdyZWUpDQpiZXN0X21vZF9hZ3JlZSA8LSBzdGVwKG1vZF9hZ3JlZSwgc2NvcGUgPSBoZWxwX3NlZWsgfiAuXjIsIGRpcmVjdGlvbiA9ICJib3RoIiwgZGF0YSA9IG1vZF9hZ3JlZSRtb2RlbCwgdHJhY2UgPSAwKSAjIEJJQyB3aXRoIGsgPSBsb2cobnJvdyhtb2RfYWdyZWUkbW9kZWwpKQ0Kc3VtbWFyeShiZXN0X21vZF9hZ3JlZSkNCmBgYA0KDQoNCmBgYHtyfQ0KZGZfaGVscHNlZWsgPC0gbmEub21pdChkZl9zY2FsZXNbLCBjKCJoZWxwX3NlZWsiLCAic2V4IiwgImFnZSIsICJhZ3JlZSIsICJhd2FyZSIsICJzb2Nfc3VwcCIsICJhZ3JlZSIsICJwb3NpdCIpXSkNCm1vZF9oZWxwc2VlayA8LSBsbShoZWxwX3NlZWsgfiBzZXggKyBhZ2UgKyBhZ3JlZSAgKyBhd2FyZSArIHNvY19zdXBwLCBkYXRhID0gZGZfaGVscHNlZWspDQpiZXN0X21vZF9oZWxwc2VlayA8LSBzdGVwKG1vZF9oZWxwc2Vlaywgc2NvcGUgPSBoZWxwX3NlZWsgfiAuXjIsIGRpcmVjdGlvbiA9ICJib3RoIiwgZGF0YSA9IG1vZF9oZWxwc2VlayRtb2RlbCwgdHJhY2UgPSAwKSAjIEJJQyB3aXRoIGsgPSBsb2cobnJvdyhtb2RfaGVscHNlZWskbW9kZWwpKQ0Kc3VtbWFyeShiZXN0X21vZF9oZWxwc2VlaykNCg0KDQpzdW1tYXJ5KGxtKGhlbHBfc2VlayB+IHNleCArIGFnZSAqIGF3YXJlLCBkYXRhID0gZGZfc2NhbGVzKSkgDQoNCg0KYGBgDQoNCg0KDQoNCg0KDQo8IS0tIFNlc3Npb24gSW5mbyBhbmQgTGljZW5zZSAtLT4NCg0KPGJyPg0KDQojIFNlc3Npb24gSW5mbw0KYGBge3Igc2Vzc2lvbl9pbmZvLCBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAnbWFya3VwJ30NCnNlc3Npb25JbmZvKCkgICAgDQpgYGANCg0KPCEtLSBGb290ZXIgLS0+DQombmJzcDsNCjxociAvPg0KPHAgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPkEgd29yayBieSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vQ2xhdWRpdVBhcGFzdGVyaS8iPkNsYXVkaXUgUGFwYXN0ZXJpPC9hPjwvcD4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48c3BhbiBzdHlsZT0iY29sb3I6ICM4MDgwODA7Ij48ZW0+Y2xhdWRpdS5wYXBhc3RlcmlAZ21haWwuY29tPC9lbT48L3NwYW4+PC9wPg0KJm5ic3A7DQo=